#ifndef	_USTC_USB_DRV_H_
#define	_USTC_USB_DRV_H_

#define	USB_IDLE	0
#define	USB_TRANSMIT	1
#define	USB_RECEIVE	2

/*usb status code*/
#define USB_OFF 			0x0 //host set usb off,clock off
#define USB_NOT_CONNECT 	0x1 //host set usb on,clock on; but not connect to usb host controler
#define USB_IN_CONFIG		0x2//connect usb host, in configuration phase
#define USB_TRANSFER_DATA	0x3//conect usb host, in normal udisk data transfer phase

#define	USB_IF_BASE	0x00000800//usb interface
#define	USB_IP_BASE	0x00000C00//usb ip core

/*self-define registers*/
#define	USB_INT_STATUS		(USB_IF_BASE+0x0)
#define	USB_INT_MASK		(USB_IF_BASE+0x4)
#define	USB_LOCK_CTL		(USB_IF_BASE+0x8)
#define	USB_RX_STATUS		(USB_IF_BASE+0xc)
#define	USB_RX_COUNT		(USB_IF_BASE+0x10)
#define	USB_TX_STATUS		(USB_IF_BASE+0x14)
#define	USB_PWR_STATUS		(USB_IF_BASE+0x18)
#define	USB_FT_STATUS		(USB_IF_BASE+0x1c)
#define	USB_PWR_INDT		(USB_IF_BASE+0x20)

#define	USB_TEST			(USB_IF_BASE+0x40)

/*usb fifo addr*/
#define USB_FIFO_RX 		(USB_IF_BASE+0x0080)
#define USB_FIFO_TX 		(USB_IF_BASE+0x00a0)

/*IP core define registers*/
//request,cotnrol,status registers
#define	APP_INTR			(USB_IP_BASE+0x00)
#define	APP_IMASK			(USB_IP_BASE+0x01)
#define	APP_CTRL			(USB_IP_BASE+0x02)
#define	APP_EP_INFO			(USB_IP_BASE+0x03)
#define	APP_CFG_VALUE		(USB_IP_BASE+0x04)
#define	APP_CFG_BMATTR		(USB_IP_BASE+0x05)
#define	APP_DEV_SPEED		(USB_IP_BASE+0x06)
#define	APP_FN				(USB_IP_BASE+0x0e)
#define	APP_EP_TRAN0		(USB_IP_BASE+0x10)
#define	APP_EP_TRAN1		(USB_IP_BASE+0x12)
#define	APP_IFUPDATE		(USB_IP_BASE+0x14)
#define	APP_CFG_IF0			(USB_IP_BASE+0x40)

//statistics registers
#define	APP_PKT_PASSED		(USB_IP_BASE+0x80)
#define	APP_PKT_DROPED		(USB_IP_BASE+0x82)
#define	APP_CRC_ERR			(USB_IP_BASE+0x84)
#define	APP_BITSTUFF_ERR	(USB_IP_BASE+0x86)
#define	APP_PID_ERR			(USB_IP_BASE+0x88)
#define	APP_FRAME_ERR		(USB_IP_BASE+0x8a)
#define	APP_TX_PKT			(USB_IP_BASE+0x8c)
#define	APP_STAT_OV			(USB_IP_BASE+0x8e)

//Endpoint Context registers; Endpoint 0 (control )
#define	APP_EP0_ADDR		(USB_IP_BASE+0x0100)
#define	APP_EP0_BMATTR		(USB_IP_BASE+0x0101)
#define	APP_EP0_MAX_SIZE	(USB_IP_BASE+0x0102)
#define	APP_EP0_IF_NUM		(USB_IP_BASE+0x0104)
#define	APP_EP0_STATUS		(USB_IP_BASE+0x0105)
#define	APP_EP0_REQ_TYPE	(USB_IP_BASE+0x0106)
#define	APP_EP0_REQEST		(USB_IP_BASE+0x0107)
#define	APP_EP0_VALUE		(USB_IP_BASE+0x0108)
#define	APP_EP0_INDEX		(USB_IP_BASE+0x010a)
#define	APP_EP0_LENGTH		(USB_IP_BASE+0x010c)

//Endpoint Context registers; Endpoint 1 (bulk out/rx )
#define	APP_EP2_ADDR		(USB_IP_BASE+0x0130)
#define	APP_EP2_BMATTR		(USB_IP_BASE+0x0131)
#define	APP_EP2_MAX_SIZE	(USB_IP_BASE+0x0132)
#define	APP_EP2_IF_NUM		(USB_IP_BASE+0x0134)
#define	APP_EP2_STATUS		(USB_IP_BASE+0x0135)
#define	APP_EP2_REQ_TYPE	(USB_IP_BASE+0x0136)
#define	APP_EP2_REQEST		(USB_IP_BASE+0x0137)
#define	APP_EP2_VALUE		(USB_IP_BASE+0x0138)
#define	APP_EP2_INDEX		(USB_IP_BASE+0x013a)
#define	APP_EP2_LENGTH		(USB_IP_BASE+0x013c)
#define	APP_EP2_SYN			(USB_IP_BASE+0x013e)

//Endpoint Context registers; Endpoint 1 (bulk in/tx )
#define	APP_EP3_ADDR		(USB_IP_BASE+0x0148)
#define	APP_EP3_BMATTR		(USB_IP_BASE+0x0149)
#define	APP_EP3_MAX_SIZE	(USB_IP_BASE+0x014a)
#define	APP_EP3_IF_NUM		(USB_IP_BASE+0x014c)
#define	APP_EP3_STATUS		(USB_IP_BASE+0x014d)
#define	APP_EP3_REQ_TYPE	(USB_IP_BASE+0x014e)
#define	APP_EP3_REQEST		(USB_IP_BASE+0x014f)
#define	APP_EP3_VALUE		(USB_IP_BASE+0x0150)
#define	APP_EP3_INDEX		(USB_IP_BASE+0x0152)
#define	APP_EP3_LENGTH		(USB_IP_BASE+0x0154)
#define	APP_EP3_SYN			(USB_IP_BASE+0x0156)


#define TXZERO						(0x20)
#define CCOMP						(0x8)
#define PSTALL						(0x4)
#define ACTIVE						(0x2)

/*USB_INT_STATUS  BIT DEFINATION*/
#define	INT_APP_INTR				(0x1)
#define	INT_TX_ACK					(0x2)
#define	INT_TX_NAK					(0x4)
#define	INT_RX_DISCARD				(0x8)
#define	INT_RX_VALID				(0x10)
#define	INT_NEED_RESET				(0x80)

/*RX STATUS BIT DEFINATION*/
#define RX_EP0_READY		(0x1)
#define RX_EP1_READY		(0x2)
#define RX_PREV_ENDP		(0x4)
#define RX_LEN				(0x7f0)
#define	RX_FIFO_CLEAR		(0x800)

/*TX STATUS BIT DEFINATION*/
#define	TX_EP0_READY		(0x1)
#define	TX_EP1_READY		(0x2)
#define	TX_PREV_ENDP		(0x4)
#define	TX_LEN				(0x7f0)
#define	TX_FIFO_CLEAR		(0x800)

/*APP INT STATUS BIT DEFINATION*/
#define 	APP_INT_SETUP	(0x1)
#define 	APP_INT_IN		(0x2)
#define 	APP_INT_OUT		(0x4)
#define		APP_INT_HALT	(0x8)
#define		APP_INT_TERR	(0x10)
#define 	APP_INT_ACK		(0x20)
#define		APP_INT_STALL	(0x80)

/*API*/
extern void 	usb_init_hw(void);
extern void		usb_deinit_hw(void);

extern USTC_U16	usb_write_ep(USTC_U8 endp,unsigned char*buff,unsigned short len);
extern USTC_U16 	usb_read_ep(USTC_U8 endp,USTC_U8 *buff);

extern void 	usb_active_ep(USTC_U8 endp ,USTC_U8 active);
extern void		usb_stall_ep(USTC_U8 endp,USTC_U8 bStalled);
extern void 	usb_set_cfg(USTC_U8 value);
extern void 	usb_set_ccomp(USTC_U8 value);

extern USTC_U8 	usb_get_ep_status(USTC_U8 endp);

#endif
